package cn.glutnn;

import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.util.ArrayList;
import java.util.List;

import javax.swing.JButton;
import javax.swing.JOptionPane;

public class Game {

	public UIMaker uiMaker = new UIMaker();

//	int $行数 = uiMaker.$总行数;
//	int $列数 = uiMaker.$总列数;

	public List<Integer> fn算法找出周围格子(Integer code) {
		Integer $左格 = code - 1;
		Integer $右格 = code + 1;
		Integer $上格 = code - uiMaker.$总列数;
		Integer $下格 = code + uiMaker.$总列数;
		Integer $左上格 = $上格 - 1;
		Integer $右上格 = $上格 + 1;
		Integer $左下格 = $下格 - 1;
		Integer $右下格 = $下格 + 1;

		List<Integer> list = new ArrayList<>();
		fn符合条件就加入(list, code, $左格);
		fn符合条件就加入(list, code, $右格);
		fn符合条件就加入(list, code, $上格);
		fn符合条件就加入(list, code, $下格);
		fn符合条件就加入(list, code, $左上格);
		fn符合条件就加入(list, code, $右上格);
		fn符合条件就加入(list, code, $左下格);
		fn符合条件就加入(list, code, $右下格);

		return list;
	}

	public void fn符合条件就加入(List<Integer> list, Integer $当前格, Integer $加入格) {
		
		int $列数 = uiMaker.$总列数;
		int $行数 = uiMaker.$总行数;
		
		boolean $存在 = $加入格 >= 0 && $加入格 <= ($列数 * $行数) - 1;
		if ($存在) {
			int $左列 = Math.max($当前格 % $列数 - 1, 0);
			int $右列 = Math.min($当前格 % $列数 + 1, $列数 - 1);

			int $上行 = Math.max($当前格 / $列数 - 1, 0);
			int $下行 = Math.min($当前格 / $列数 + 1, $行数 - 1);

			int $加入格所在列 = $加入格 % $列数;
			int $加入格所在行 = $加入格 / $列数;

			if ($加入格所在列 >= $左列 && $加入格所在列 <= $右列) {
				if ($加入格所在行 >= $上行 && $加入格所在行 <= $下行) {
					list.add($加入格);
				}
			}
		}
	}

	public void fn1选择模式() {
		// 同时处理2
		// TODO:在UImaker里处理
		fn3初始化游戏界面();
		
		fn1_1添加菜单事件();
	}
	
	public void fn1_1添加菜单事件() {
		MyMenuItemActionListener listener = new MyMenuItemActionListener(this);
		uiMaker.$menuitem_初级.addActionListener(listener);
		uiMaker.$menuitem_中级.addActionListener(listener);
		uiMaker.$menuitem_高级.addActionListener(listener);
	}

	public void fn3初始化游戏界面() {
		uiMaker.initUI();
		fn3_1游戏埋雷();
		fn4格子上点击鼠标键();
	}
	
	public void fn3_1游戏埋雷() {
		for(int i = 0, ii = uiMaker.$雷数; i < ii; i++) {
			int $有雷格 = (int) (Math.random() * uiMaker.$总列数 * uiMaker.$总行数);
			
			Gezi t = uiMaker.buttons[$有雷格];
			if (t.isLei) {
				i--;
				continue;
			} else {				
				uiMaker.buttons[$有雷格].isLei = true;
			}
		}
		
		
		for(int i = 0, ii = uiMaker.buttons.length; i < ii; i++) {
//			JButton btn = uiMaker.buttons[i];
			fn3_2设置当前格为周围格的雷数(i);
		}
	}

	private void fn3_2设置当前格为周围格的雷数(int $当前格) {
		Gezi $当前gezi = uiMaker.buttons[$当前格];
		
		if ($当前gezi.isLei) {
			return;
		}
		
		List<Integer> $周围格子 = fn算法找出周围格子($当前格);
		
		int $雷数 = 0;
		for(Integer i : $周围格子) {
			Gezi g = uiMaker.buttons[i];
			if (g.isLei) {
				$雷数++;
			}
		}
		
		$当前gezi.num = $雷数;
		
	}

	public void fn4格子上点击鼠标键() {
		for(int i = 0, ii = uiMaker.buttons.length; i < ii; i++) {
			final Gezi btn = uiMaker.buttons[i];
			
			btn.addMouseListener(new MouseAdapter() {
				@Override
				public void mouseClicked(MouseEvent e) {
					super.mouseClicked(e);
					// 处理5
					boolean click左 = e.getButton() == 1;
					boolean click右 = e.getButton() == 3;
					
					if (click左) {
						fn5_1处理左键事件(btn);
					} else if (click右) {
						fn5_2处理右键事件(btn);
					}
				}
			});
		}
	}

	public void fn5_1处理左键事件(Gezi gezi) {
		
		uiMaker.fn计时功能开始();
		// 处理6
		if(gezi.isLei) {
			// 处理15
			
			for(Gezi g: uiMaker.buttons) {
				if (g.isLei) {					
					g.setText("R");
				} else {
					if (g.num == 0) {
						g.setText("");
					} else {						
						g.setText(""+g.num);
					}
				}
				g.setEnabled(false);
			}
			
			uiMaker.fn计时功能结束();
			uiMaker.$状态value.setText("游戏失败");
			Toolkit.getDefaultToolkit().beep();
			JOptionPane.showMessageDialog(null, "你踩到雷了", "游戏结束",JOptionPane.ERROR_MESSAGE);
//			System.out.println("游戏结束");
			
		} else {
			fn7是否显示周围格子(gezi);
		}
	}

	public void fn5_2处理右键事件(Gezi btn) {
		String text = btn.getText();
		// 处理16
		if("Q".equals(text)) {
			// 处理17
			btn.setText("");
			uiMaker.$剩余地雷个数++;
			uiMaker.$剩余地雷个数value.setText("" + uiMaker.$剩余地雷个数);
		} else if("".equals(text)) {
			// 处理18
			btn.setText("Q");
			uiMaker.$剩余地雷个数--;
			uiMaker.$剩余地雷个数value.setText("" + uiMaker.$剩余地雷个数);
		}
	}

	public void fn7是否显示周围格子(Gezi gezi) {
		// 处理8
		if (gezi.num == 0) {
			// 处理13
			gezi.fn翻开();
			
			List<Integer> $周围格子code = fn算法找出周围格子(gezi.code);
			
			for(Integer code : $周围格子code) {
				Gezi g = uiMaker.buttons[code];
				// 处理14
//				g.fn翻开();
				if (g.isEnabled()) {	
					fn7是否显示周围格子(g);
				}
			}
			
			fn10是否所有非雷格都显示完成();
		} else {
			// 处理9
			gezi.setText(""+gezi.num);
			gezi.fn翻开();
			fn10是否所有非雷格都显示完成();
		}
	}
	
	public void fn10是否所有非雷格都显示完成() {
		
		int $胜利需要达到的总数 = uiMaker.$格子数 - uiMaker.$雷数;
		int $计数 = 0;
		
		for(Gezi g: uiMaker.buttons) {
			if (!g.isLei) {
				boolean $被翻开过了 = !g.isEnabled();
				if ($被翻开过了) {
					$计数++;
				}
			}
		}
		
		if ($计数 == $胜利需要达到的总数) {
			uiMaker.fn计时功能结束();
			uiMaker.$状态value.setText("游戏胜利");
			Toolkit.getDefaultToolkit().beep();
			JOptionPane.showMessageDialog(null, "恭喜您胜利", "游戏结束",JOptionPane.ERROR_MESSAGE);
			
		}
	}

}
